package com.jt.controller;

import com.jt.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.StringReader;
import java.util.Arrays;

/**
 * SpringMVC调用步骤：
 * 1.当用户发起请求时，被SpringMVC框架中的前端控制器（DispatcherServlet）拦截
 * 2.由于前端控制器（DispatcherServlet）并不清楚哪个方法与请求对应，所以查询处理器映射器（HandlerMapping）
 * 3.当tomcat服务器启动，则处理器映射器（HandlerMapping）会加载所有的@RequestMapping注解，将其中的路径与方法进行绑定，
 * Map</请求路径，包名.类名.方法名(参数)>，查找到的方法信息回传给前端控制器（DispatcherServlet），进行后续调用
 * 4.秉承着松耦合的思想，前端控制器（DispatcherServlet）将查询得到的方法，请求处理器适配器（HandlerAdapter）
 * （mvc针对不同的配置文件有专门的处理器(运行程序的机制)挑选合适的处理器去执行（程序配置的规则），无需人为干预）
 * 5.当挑选合适的处理器之后，程序开始真正的执行业务方法，Controller-Service-Mapper(Dao)，执行业务，
 * 当业务执行成功之后，返回同一个的ModelAndView对象，其中包含2个部分数据：1-Model（服务器数据） 2.View（页面逻辑名称）
 * 6.当前端控制器（DispatcherServlet）获取ModelAndView对象之后，交给视图解析器（ViewResolver），解析View对象的逻辑名称，
 * 动态的拼接前缀 + 逻辑页面名称 + 后缀，最终形成了用户展现页面的全路径
 * 7.将Model数据填充到页面中的过程，叫做视图渲染，渲染之后，将数据加精哦给前端控制器处理（DispatcherServlet）
 * 8.将得到的完整页面响应交给用户展现
 */
@Controller
public class UserController {


    /**
     * 1.准备一个请求findUser
     * 2.要求转到findDog
     * 3.关键字
     *      forward：转发
     *      redirect：重定向
     * 4.特点：
     *      1.转发时，会携带用户提交的数据
     *      2.转发时，用户浏览器的地址不会发生改变
     *      3.重定向时，由于是多次请求，所以不会携带用户的数据
     *      4.重定向时，由于是多次请求，所以浏览器的地址会发生改变
     * 5.实际意义：
     *      实现方法内部的解耦
     * 6.什么时候使用转发，什么时候使用重定向？
     *      1.如果需要携带参数，使用转发
     *      2.如果一个业务已经完成而需要一个新的开始，则使用重定向
     * @param name
     * @return
     *
     *
     */
    @RequestMapping("/findUser")
    public String findUser(String name){
        //return "forward:/findDog";
        return  "redirect:/findDog";
    }

    /**
     * 需要将那么属性返回给页面
     * @param name
     * @return
     */
    @RequestMapping("/findDog")
    public String findDog(String name,Model model){
        model.addAttribute("name",name+"汪汪汪");
        return "dog";
    }


    @RequestMapping("/user/addUser")
    public String addUserDog(User user){
        System.out.println("参数："+ user.toString());
        return "success";
    }

    /**
     * 对象赋值：
     *      要求：
     *      1.pojo对象中必须有get/set方法
     *      2.当用户提交数据之后，利用独享的set方法为属性赋值
     * @param user
     * @return
     */
    //@RequestMapping("/user/addUser")
    public String addUserHobbys(User user){
        System.out.println("参数："+ user.toString());
        return "success";
    }

    //@RequestMapping("/user/addUser")
    public String addHobbys(Integer id, String name,String[] hobby){
        System.out.println("参数：" + id + ":" + name+":"+ Arrays.toString(hobby));
        return "success";
    }

    /**
     * 请求参数：id: 123 name: 老王
     * 测试@RequestParam注解
     * @RequestParam 参数说明：
     *      1.name/value 接收参数的名称
     *      2.required 默认值true，该数据项为必填项
     *      3.defaultValue 设定数据默认值，如果参数为null，则设定默认值
     * @param id
     * @param name
     * @return
     */
    //@RequestMapping("/user/addUser")
    public String addUserParam(@RequestParam(value = "id",required = true,defaultValue = "123456890") Integer id, String name){
        System.out.println("参数：" + id + ":" + name);
        return "success";
    }


    /**
     * SpringMVC赋值：
     *      内部根据request,getParameter("id")方式获取数据
     * @param id
     * @param name
     * @return
     */
    //@RequestMapping("/user/addUser")
    public String addUser(Integer id,String name){
        System.out.println("参数：" + id + ":" + name);
        return "success";
    }

    /**
     * 请求路径：http://localhost:8090/user/addUser
     * 请求参数：id: 123 name: 老王
     *
     * request/response 只要用户调用就会自动的赋值
     *
     * Servlet缺点：接受的参数都是String类型
     *
     * @return
     */
    //@RequestMapping("/user/addUser")
    //public String addUser(HttpServletRequest request){
    //    Integer id = Integer.parseInt(request.getParameter("id"));
    //    String name = request.getParameter("name");
    //    System.out.println("参数：" + id + ":" + name);
    //    return "success";
    //}


    //简化数据传递
    @RequestMapping("/user")
    public String toUser(Model model){
        //将数据通过model绑定
        model.addAttribute("id",1234);
        model.addAttribute("name","虚劳嫖");
        return "user";
    }



    /**
     * MVC顶层数据传输的原则
     * url：http://localhost:8090/user
     * ModelAndView:
     *      1.model 封装数据
     *      2.view 封装视图页面
     */
    //@RequestMapping("/user")
    //public ModelAndView toUser(){
    //    ModelAndView modelAndView = new ModelAndView();
    //    //封装数据
    //    modelAndView.addObject("id",1001);
    //    modelAndView.addObject("name","安其拉");
    //    //封装页面数据
    //    modelAndView.setViewName("user");
    //    return modelAndView;
    //}

}
